#include <iostream>
#include <cstring>

using namespace std;

/*
链表方式

*/

typedef struct StackListNode
{
    char data;
    StackListNode *next;
} StackListNode;
typedef struct StackList
{
    int tatal;
    StackListNode *head;
};
void initStackList(StackList *sl)
{
    (*sl).tatal = 0;
    (*sl).head = NULL;
}
void pushStackList(StackList *sl, char c)
{
    StackListNode *node = (StackListNode *)malloc(sizeof(StackListNode));
    (*node).data = c;
    if (!(*sl).head)
    {
        (*node).next = NULL;
        (*sl).head = node;
    }
    else
    {
        (*node).next = (*sl).head;
        (*sl).head = node;
    }
}
void popStackList(StackList *sl, char *c)
{
    if ((*sl).head)
    {
        StackListNode *node = (*sl).head;
        *c = (*node).data;
        if ((*node).next)
            (*sl).head = (*node).next;
        else
            (*sl).head = NULL;
    }
}
bool emptyStackList(StackList sl)
{
    if (!(sl.head))
        return true;
    return false;
}
/*
数组方式

*/
typedef struct StackArray
{
    char arr[10];
    int top;
};
void initStackArray(StackArray *sa)
{
    for (int i = 0; i < 10; i++)
        (*sa).arr[i] = '\0';
    (*sa).top = 0;
}
void pushStackArray(StackArray *sa, char c)
{
    (*sa).arr[(*sa).top] = c;
    (*sa).top++;
}
void popStackArray(StackArray *sa, char *c)
{
    if ((*sa).top)
        *c = (*sa).arr[(*sa).top--];
}
bool emptyStackArray(StackArray sa)
{
    if (!(sa.top))
        return true;
    return false;
}

int SolutionList()
{
    // 待匹配字符串
    char *str = "()()()\0";
    int len = strlen(str);
    StackList sl;
    char c;
    initStackList(&sl);
    for (auto i = 0; i < len; i++)
    {
        if (str[i] == '(')
            pushStackList(&sl, str[i]);
        else if (str[i] == ')' && !emptyStackList(sl))
            popStackList(&sl, &c);
        else if (str[i] == ')' && emptyStackList(sl))
            return 0;
    }
    if (emptyStackList(sl))
        return 1;
    return 0;
}
int SolutionArray()
{
    // 待匹配字符串
    char *str = "()()()\0";
    int len = strlen(str);
    StackArray sa;
    char c;
    initStackArray(&sa);
    for (auto i = 0; i < len; i++)
    {
        if (str[i] == '(')
            pushStackArray(&sa, str[i]);
        else if (str[i] == ')' && !emptyStackArray(sa))
            popStackArray(&sa, &c);
        else if (str[i] == ')' && emptyStackArray(sa))
            return 0;
    }
    if (emptyStackArray(sa))
        return 1;
    return 0;
}
int main()
{
    if (SolutionArray())
        cout << "yes";
    if (!SolutionArray())
        cout << "no";
    if (SolutionList())
        cout << "yes";
    if (!SolutionList())
        cout << "no";
    return 0;
}
